#include <stdio.h>
#include "types.h"

CodeType    MEMC[MAX_ADDRESS+1];	//obszar pami�ci kodu 
DataType    MEMD[MAX_ADDRESS+1];	//obszar pami�ci danych
DataType    REG[MAX_REGISTER+1];	//deklaracja przechowywania rejestr�w

AddressType   PC;					//licznik rozkaz�w
DataType    FLAGS;					//flagi procesora


void loadMEMC(char *file){			//�adowanie pami�ci kodu z pliku 
     FILE *file_ptr;
    file_ptr=fopen(file, "rb");
    if(!file_ptr){
        printf("MEMC file not found (%s)!\n", file);
        exit(-2);
    }
    fseek(file_ptr, 0, SEEK_SET);
    fread(MEMC, MAX_ADDRESS+1, 1, file_ptr);
    fclose(file_ptr);
}

void loadMEMD(char *file){        //�adowanie pami�ci danych z pliku
     FILE *file_ptr;
    file_ptr=fopen(file, "rb");
    if(!file_ptr){
        printf("MEMD file not found (%s)!\n", file);
        exit(-3);
    }    
    fseek(file_ptr, 0, SEEK_SET);
    fread(MEMD, MAX_ADDRESS+1, 1, file_ptr);
    fclose(file_ptr);
}

void saveMEMD(char *file){        //zapisz zawarto�� pami�ci danych do pliku 
     FILE *file_ptr;
    file_ptr=fopen(file, "wb");
    if(!file_ptr){
        printf("MEMD cannot open to write (%s)!\n", file);
        exit(-3);
    }    
    fseek(file_ptr, 0, SEEK_SET);
    fwrite(MEMD, MAX_ADDRESS+1, 1, file_ptr);
    fclose(file_ptr);
}



void printMEMD(){
	printf("\nZawartość MEMD\n %s",MEMD);
}

void printREG(){
	printf("Zawartość REG\n %s",REG);
}

CodeType getMEMC(AddressType p){
 return MEMC[p];
}

void printMEMC(){
	unsigned short i = 0;

	for(i = 0; i < 10; i++){
		printf("MEMC[%d] = 0x%x\n",i,MEMC[i]);
	}
}

DataType getMEMD(AddressType p){
 return MEMD[p];
}

void setPC(AddressType v){
 PC=v;
}

AddressType getPC(void){
 return PC;
}

void incPC(void){
 PC++;
}

DataType getRegister(int n){
 return REG[n];
}

void setRegister(int n, DataType v){
 REG[n]=v;
}

void setFlagsRegister(int b){
 FLAGS = FLAGS | (1<<b);
}

void resetFlagsRegister(int b){
 FLAGS = FLAGS & (~(1<<b));
}

int getFlagsRegister(int b){
 return FLAGS & (1<<b);
}
